///////////////////////////////////////////////////////////////////////////////////
// УПРАВЛЕНИЕ ЗАПУСКОМ КОМАНД 1С:Предприятия 8
// Адаптация баблиотеки v8runner  https://github.com/oscript-library/v8runner
// под платформу 1С
#Область ПрограммныйИнтерфейс

// Текущий контекст выполняется на операционной системе Windows
// 
// Возвращаемое значение:
//  Булево - Это windows
Функция ЭтоWindows() Экспорт
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ЭтоWindows();
КонецФункции

// Начать получение контекста команды конфигуратора.
// 
// Параметры:
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - 
Процедура НачатьПолучениеКонтекстаКомандыКонфигуратора(ОписаниеОповещенияОЗавершении) Экспорт
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	УИ_ОбщегоНазначенияКлиент.ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("НачатьПолучениеКонтекстаКомандыКонфигуратораПослеПодключенияРасширенияРаботыСФайлами",
		ЭтотОбъект, ПараметрыОповещения));
КонецПроцедуры

// Путь к временной базе.
// 
// Параметры:
//  КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора 
// 
// Возвращаемое значение:
//  Строка - Путь к временной базе
Функция ПутьКВременнойБазе(КонтекстКоманды) Экспорт
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КонтекстКоманды.КаталогСборки, "v8r_TempDB");
КонецФункции

// Начать создание временной базы.
// 
// Параметры:
//  КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - Описание оповещения о завершении
Процедура НачатьСозданиеВременнойБазы(КонтекстКоманды, ОписаниеОповещенияОЗавершении = Неопределено) Экспорт

	КаталогВременнойБазы = ПутьКВременнойБазе(КонтекстКоманды);

	НачатьСозданиеФайловойБазы(КонтекстКоманды, КаталогВременнойБазы, ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Начать проверку существования временной базы.
// 
// Параметры:
//  Контекст - см. НовыйКонтекстКомандыКонфигуратора
// 	ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьПроверкуСуществованияВременнойБазы(Контекст, ОписаниеОповещенияОЗавершении) Экспорт
	ФайлБазы = Новый Файл(УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ПутьКВременнойБазе(Контекст), "1Cv8.1CD"));
	ФайлБазы.НачатьПроверкуСуществования(ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Начать создание файловой базы.
// 
// Параметры:
//  КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  КаталогБазы - Строка - Каталог базы
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - Описание оповещения о завершении
//  ПутьКШаблону - Строка - Путь к шаблону
Процедура НачатьСозданиеФайловойБазы(КонтекстКоманды, КаталогБазы, ОписаниеОповещенияОЗавершении = Неопределено,
	ПутьКШаблону = "") Экспорт

	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("КонтекстКоманды", КонтекстКоманды);
	ПараметрыОповещения.Вставить("КаталогБазы", КаталогБазы);
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ПараметрыОповещения.Вставить("ПутьКШаблону", ПутьКШаблону);

	УИ_ОбщегоНазначенияКлиент.НачатьОбеспечениеКаталога(КаталогБазы,
														Новый ОписаниеОповещения("НачатьСозданиеФайловойБазыЗавершениеОбеспеченияКаталога",
		ЭтотОбъект, ПараметрыОповещения));

КонецПроцедуры

// Начать сборку обработки из файлов.
// 
// Параметры:
//  КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  ИмяИсходногоФайлаОбработки - Строка - Имя главного файла обработки, выгруженной в файлы
//  ИмяРезультирующегоФайла - Строка - Имя собранного файла обработки
//  ОписаниеОповещенияОЗавершении - Неопределено - Описание оповещения о завершении
Процедура НачатьСборкуОбработкиИзФайлов(КонтекстКоманды, ИмяИсходногоФайлаОбработки, ИмяРезультирующегоФайла,
	ОписаниеОповещенияОЗавершении = Неопределено) Экспорт
	ПараметрыЗапуска = СтандартныеПараметрыЗапускаКонфигуратора(КонтекстКоманды);
	ПараметрыЗапуска.Добавить("/LoadExternalDataProcessorOrReportFromFiles """
							  + ИмяИсходногоФайлаОбработки
							  + """  """
							  + ИмяРезультирующегоФайла
							  + """");

	НачатьВыполнениеКоманды(КонтекстКоманды, ПараметрыЗапуска, ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Начать выполнение команды.
// 
// Параметры:
//  КонтекстКоманды -  см. НовыйКонтекстКомандыКонфигуратора
//  Параметры - Массив из Строка 
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - Описание оповещения о завершении
Процедура НачатьВыполнениеКоманды(КонтекстКоманды, Параметры, ОписаниеОповещенияОЗавершении) Экспорт
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Контекст", КонтекстКоманды);
	ПараметрыОповещения.Вставить("Параметры", Параметры);
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);

	НачатьПроверкуВозможностиВыполненияКоманды(КонтекстКоманды,
											   Новый ОписаниеОповещения("НачатьВыполнениеКомандыЗавершениеПроверкиВозможностиВыполненияКоманды",
		ЭтотОбъект, ПараметрыОповещения));

КонецПроцедуры


// Начать выгрузку информационной базы в файл.
// 
// Параметры:
//  КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  ПутьВыгрузкиИБ - Строка - Путь выгрузки ИБ
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -
//Процедура НачатьВыгрузкуИнформационнойБазыВФайл(КонтекстКоманды, ПутьВыгрузкиИБ, ОписаниеОповещенияОЗавершении) Экспорт
//
//	Файл = Новый Файл(ПутьВыгрузкиИБ);
//	КаталогВыгрузкиИБ = Файл.Путь;
//
//	УИ_ОбщегоНазначенияКлиент.НачатьОбеспечениеКаталога(КаталогБазы,
//														Новый ОписаниеОповещения("НачатьВыгрузкуИнформационнойБазыВФайлЗавершениеОбеспеченияКаталога",
//		ЭтотОбъект, ПараметрыОповещения));
//
//
//	ОбеспечитьКаталог(КаталогВыгрузкиИБ);
//
//
//КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Начать выполнение команды завершение проверки возможности выполнения команды.
// 
// Параметры:
//  ВыполнениеВозможно - Булево - Признак, что все проверки прошли успешно
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* Контекст - см. НовыйКонтекстКомандыКонфигуратора
//  	* Параметры - Массив из Строка
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьВыполнениеКомандыЗавершениеПроверкиВозможностиВыполненияКоманды(ВыполнениеВозможно,
	ДополнительныеПараметры) Экспорт
	Файл = Новый Файл(ДополнительныеПараметры.Контекст.ИмяФайлаИнформации);

	Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("НачатьВыполнениеКомандыЗавершениеПроверкиСуществованияФайлаИнформации",
		ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры

// Начать выполнение команды завершение проверки существования файла информации.
// 
// Параметры:
//  Существует - Булево - Признак существования файла
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* Контекст - см. НовыйКонтекстКомандыКонфигуратора
//  	* Параметры - Массив из Строка
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьВыполнениеКомандыЗавершениеПроверкиСуществованияФайлаИнформации(Существует, ДополнительныеПараметры) Экспорт
	Если Существует Тогда
		НачатьУдалениеФайлов(Новый ОписаниеОповещения("НачатьВыполнениеКомандыЗавершениеУдаленияФайлаИнформации",
			ЭтотОбъект, ДополнительныеПараметры, "НачатьВыполнениеКомандыЗавершениеУдаленияФайлаИнформацииСОшибкой",
			ЭтотОбъект), ДополнительныеПараметры.Контекст.ИмяФайлаИнформации);
	Иначе
		ЗапуститьИПодождать(ДополнительныеПараметры.Контекст,
							ДополнительныеПараметры.Параметры,
							ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);
	КонецЕсли;
КонецПроцедуры

// Начать выполнение команды завершение удаления файла информации.
// 
// Параметры:
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* Контекст - см. НовыйКонтекстКомандыКонфигуратора
//  	* Параметры - Массив из Строка
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьВыполнениеКомандыЗавершениеУдаленияФайлаИнформации(ДополнительныеПараметры) Экспорт
	ЗапуститьИПодождать(ДополнительныеПараметры.Контекст,
						ДополнительныеПараметры.Параметры,
						ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Начать выполнение команды завершение удаления файла информации с ошибкой.
// 
// Параметры:
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* Контекст - см. НовыйКонтекстКомандыКонфигуратора
//  	* Параметры - Массив из Строка
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьВыполнениеКомандыЗавершениеУдаленияФайлаИнформацииСОшибкой(ДополнительныеПараметры) Экспорт
	ЗапуститьИПодождать(ДополнительныеПараметры.Контекст,
						ДополнительныеПараметры.Параметры,
						ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);
КонецПроцедуры


// Начать получение контекста команды конфигуратора после подключения расширения работы с файлами.
// 
// Параметры:
//  Подключено - Булево -
//  ДополнительныеПараметры -Структура - Параметры оповещения:
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьПолучениеКонтекстаКомандыКонфигуратораПослеПодключенияРасширенияРаботыСФайлами(Подключено,
	ДополнительныеПараметры) Экспорт
	Если Не Подключено Тогда
		Возврат;
	КонецЕсли;
	
	Контекст = НовыйКонтекстКомандыКонфигуратора();
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Контекст);
КонецПроцедуры

// Начать создание файловой базы завершение обеспечения каталога.
// 
// Параметры:
//  Успешно - Булево - Успешно удалось обеспечить каталог
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  	* КаталогБазы - Строка -
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* ПутьКШаблону - Строка
Процедура НачатьСозданиеФайловойБазыЗавершениеОбеспеченияКаталога(Успешно, ДополнительныеПараметры) Экспорт
	Если Не Успешно Тогда
		Возврат;
	КонецЕсли;
		
	НачатьУдалениеФайлов(Новый ОписаниеОповещения("НачатьСозданиеФайловойБазыЗавершениеОчисткиКаталога", ЭтотОбъект,
		ДополнительныеПараметры), ДополнительныеПараметры.КаталогБазы, "*.*");
	
КонецПроцедуры

// Начать создание файловой базы завершение очистки каталога.
// 
// Параметры:
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  	* КаталогБазы - Строка -
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* ПутьКШаблону - Строка
Процедура НачатьСозданиеФайловойБазыЗавершениеОчисткиКаталога(ДополнительныеПараметры) Экспорт

	ПараметрыЗапуска = Новый Массив;
	ПараметрыЗапуска.Добавить("CREATEINFOBASE");
	ПараметрыЗапуска.Добавить("File="""+ДополнительныеПараметры.КаталогБазы+"""");
	ПараметрыЗапуска.Добавить("/Out""" + ДополнительныеПараметры.КонтекстКоманды.ИмяФайлаИнформации + """");
	
//	Если ИмяБазыВСписке <> "" Тогда
//        ПараметрыЗапуска.Добавить("/AddInList"""+ ИмяБазыВСписке + """");
//    КонецЕсли;
	Если ЗначениеЗаполнено(ДополнительныеПараметры.ПутьКШаблону) Тогда
        ПараметрыЗапуска.Добавить("/UseTemplate"""+ ДополнительныеПараметры.ПутьКШаблону + """");
    КонецЕсли;

	Если ЗначениеЗаполнено(ДополнительныеПараметры.КонтекстКоманды.КодЯзыка) Тогда
		ПараметрыЗапуска.Добавить("/L"+ДополнительныеПараметры.КонтекстКоманды.КодЯзыка);
	КонецЕсли;
	Если ЗначениеЗаполнено(ДополнительныеПараметры.КонтекстКоманды.КодЯзыкаСеанса) Тогда
		ПараметрыЗапуска.Добавить("/VL"+ДополнительныеПараметры.КонтекстКоманды.КодЯзыкаСеанса);
	КонецЕсли;
	
	ЗапуститьИПодождать(ДополнительныеПараметры.КонтекстКоманды,
						ПараметрыЗапуска,
						ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Начать создание файловой базы завершение выполнения.
// 
// Параметры:
//  КодВозврата - Число
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  	* КаталогБазы - Строка -
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* ПутьКШаблону - Строка
Процедура ЗапуститьИПодождатьЗавершениеВыполнения(КодВозврата, ДополнительныеПараметры) Экспорт
	Если КодВозврата = 0 Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
		Возврат;
	КонецЕсли;
		
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Ложь);
//
//	КодВозврата = ЗапуститьИПодождать(ПараметрыЗапуска);
//	УстановитьВывод(ПрочитатьФайлИнформации());
//	Если КодВозврата <> 0 Тогда
//		ВызватьИсключение ВыводКоманды();
//	КонецЕсли; 

//	УстановитьВывод(ПрочитатьФайлИнформации());
//	Если КодВозврата <> 0 Тогда
//		Лог.Ошибка("Получен ненулевой код возврата "+КодВозврата+". Выполнение скрипта остановлено!");
//		ВызватьИсключение ВыводКоманды();
//	Иначе
//		Лог.Отладка("Код возврата равен 0");
//	КонецЕсли;

КонецПроцедуры

// Начать проверку возможности выполнения команды завершение проверки существования временной базы.
// 
// Параметры:
//  Существует - Булево -
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* Контекст - см. НовыйКонтекстКомандыКонфигуратора
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура НачатьПроверкуВозможностиВыполненияКомандыЗавершениеПроверкиСуществованияВременнойБазы(Существует,
	ДополнительныеПараметры) Экспорт
	Если Существует Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
		Возврат;
	КонецЕсли;


	НачатьСозданиеВременнойБазы(ДополнительныеПараметры.Контекст, ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);

КонецПроцедуры


// Начать создание файловой базы завершение обеспечения каталога.
// 
// Параметры:
//  Успешно - Булево - Успешно удалось обеспечить каталог
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  	* КаталогБазы - Строка -
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* ПутьКШаблону - Строка
Процедура НачатьВыгрузкуИнформационнойБазыВФайлЗавершениеОбеспеченияКаталога(Успешно, ДополнительныеПараметры) Экспорт
	Если Не Успешно Тогда
		Возврат;
	КонецЕсли;
		
	ПараметрыЗапуска = СтандартныеПараметрыЗапускаКонфигуратора(ДополнительныеПараметры.КонтекстКоманды);

//	ПараметрыЗапуска.Добавить("/DumpIB " + ОбернутьВКавычки(ПутьВыгрузкиИБ));
//
//	ВыполнитьКоманду(ПараметрыЗапуска);
//	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Новый контекст команды.
// 
// Возвращаемое значение:
//  Структура - Новый контекст команды:
// * КлючСоединенияСБазой - Строка -
// * ИмяПользователя - Строка -
// * Пароль - Строка -
// * КлючРазрешенияЗапуска - Строка -
// * КодЯзыка - Строка -
// * КодЯзыкаСеанса - Строка -
// * ПутьКПлатформе1С - Строка - Путь к исполняемому файлу конфигуратора
// * ИмяФайлаИнформации - Строка - Имя файла результата выполнения команды
// * КаталогСборки - Строка - Каталог всех временных файлов
Функция НовыйКонтекстКомандыКонфигуратора() 
	Струкутура = Новый Структура;
	Струкутура.Вставить("КаталогСборки", КаталогСборки());
	Струкутура.Вставить("ИмяФайлаИнформации", ИмяФайлаИнформации(Струкутура.КаталогСборки));
	Струкутура.Вставить("КлючСоединенияСБазой", "");
	Струкутура.Вставить("ИмяПользователя", "");
	Струкутура.Вставить("Пароль", "");
	Струкутура.Вставить("КлючРазрешенияЗапуска", "");
	Струкутура.Вставить("КодЯзыка", "");
	Струкутура.Вставить("КодЯзыкаСеанса", "");
	Струкутура.Вставить("ПутьКПлатформе1С", ПутьКПлатформеПоУмолчанию());

	Возврат Струкутура;
КонецФункции

// Определяет путь к файлу запуска конфигуратора текущей запущенной платформы
// 
// Возвращаемое значение:
//  Строка - Путь к платформе по умолчанию
Функция ПутьКПлатформеПоУмолчанию()
#Если ВебКлиент Тогда
	Возврат "";
#Иначе
		Возврат УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогПрограммы(), ?(ЭтоWindows(), "1cv8.exe", "1cv8"));
#КонецЕсли
КонецФункции

Функция КаталогСборки(Знач Каталог = "") Экспорт

	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(УИ_ОбщегоНазначенияКлиент.КаталогВспомогательныхБиблиотекИнструментов(),
														   "configexecutor");

КонецФункции

Функция ИмяФайлаИнформации(КаталогСборки) Экспорт
	Если Не ЗначениеЗаполнено(КаталогСборки) Тогда
		Возврат "";
	КонецЕсли;

	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогСборки,
														   Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=0;")
														   + ".txt")
КонецФункции


// Ключ временного контекста.
// 
// Параметры:
//  Контекст - см. НовыйКонтекстКомандыКонфигуратора
// 
// Возвращаемое значение:
//  Строка - Ключ временного контекста
Функция КлючВременногоКонтекста(Контекст)
	Возврат "/F""" + ПутьКВременнойБазе(Контекст) + """";
КонецФункции


// Ключ соединения с базой.
// 
// Параметры:
//  Контекст - см. НовыйКонтекстКомандыКонфигуратора
// 
// Возвращаемое значение:
// Строка 
Функция КлючСоединенияСБазой(Контекст)
	Если ПустаяСтрока(Контекст.КлючСоединенияСБазой) Тогда
		Возврат КлючВременногоКонтекста(Контекст);
	Иначе
		Возврат Контекст.КлючСоединенияСБазой;
	КонецЕсли;
КонецФункции

// Стандартные параметры запуска конфигуратора.
// 
// Параметры:
//  Контекст - см. НовыйКонтекстКомандыКонфигуратора
// 
// Возвращаемое значение:
//  Массив из Строка - Стандартные параметры запуска конфигуратора
Функция СтандартныеПараметрыЗапускаКонфигуратора(Контекст)

	ПараметрыЗапуска = Новый Массив;
	ПараметрыЗапуска.Добавить("DESIGNER");
	ПараметрыЗапуска.Добавить(КлючСоединенияСБазой(Контекст));

	ПараметрыЗапуска.Добавить("/Out" + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(Контекст.ИмяФайлаИнформации));
	Если Не ПустаяСтрока(Контекст.ИмяПользователя) Тогда
		ПараметрыЗапуска.Добавить("/N" + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(Контекст.ИмяПользователя));
	КонецЕсли;
	Если Не ПустаяСтрока(Контекст.Пароль) Тогда
		ПараметрыЗапуска.Добавить("/P" + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(Контекст.Пароль));
	КонецЕсли;
	ПараметрыЗапуска.Добавить("/WA+");
	Если Не ПустаяСтрока(Контекст.КлючРазрешенияЗапуска) Тогда
		ПараметрыЗапуска.Добавить("/UC"
								  + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(Контекст.КлючРазрешенияЗапуска));
	КонецЕсли;
	Если Не ПустаяСтрока(Контекст.КодЯзыка) Тогда
		ПараметрыЗапуска.Добавить("/L" + Контекст.КодЯзыка);
	КонецЕсли;
	Если Не ПустаяСтрока(Контекст.КодЯзыкаСеанса) Тогда
		ПараметрыЗапуска.Добавить("/VL" + Контекст.КодЯзыкаСеанса);
	КонецЕсли;
	ПараметрыЗапуска.Добавить("/DisableStartupMessages");
	ПараметрыЗапуска.Добавить("/DisableStartupDialogs");

	Возврат ПараметрыЗапуска;

КонецФункции

// Запустить и подождать.
// 
// Параметры:
//  КонтекстКоманды - см. НовыйКонтекстКомандыКонфигуратора
//  Параметры - Массив из Строка
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - 
Процедура ЗапуститьИПодождать(КонтекстКоманды, Параметры, ОписаниеОповещенияОЗавершении)

	СтрокаЗапуска = "";
	СтрокаДляЛога = "";
	Для Каждого Параметр Из Параметры Цикл

		СтрокаЗапуска = СтрокаЗапуска + " " + Параметр;

		Если Лев(Параметр,2) <> "/P" и Лев(Параметр,25) <> "/ConfigurationRepositoryP" Тогда
			СтрокаДляЛога = СтрокаДляЛога + " " + Параметр;
		КонецЕсли;

	КонецЦикла;

	Приложение = УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(КонтекстКоманды.ПутьКПлатформе1С);

	Если Не ЭтоWindows() Тогда 
		СтрокаЗапуска = "sh -c '"+Приложение + СтрокаЗапуска + "'";
	Иначе
		СтрокаЗапуска = Приложение + СтрокаЗапуска;
	КонецЕсли;

	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	Оповещение = Новый ОписаниеОповещения("ЗапуститьИПодождатьЗавершениеВыполнения", ЭтотОбъект, ПараметрыОповещения);

	НачатьЗапускПриложения(Оповещение, СтрокаЗапуска, , Истина);

КонецПроцедуры


// Начать проверку возможности выполнения команды.
// 
// Параметры:
//  Контекст - см. НовыйКонтекстКомандыКонфигуратора
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - Описание оповещения о завершении
Процедура НачатьПроверкуВозможностиВыполненияКоманды(Контекст, ОписаниеОповещенияОЗавершении)

	Если Не ЗначениеЗаполнено(Контекст.ПутьКПлатформе1С) Тогда
		ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, Ложь);
		Возврат;
	КонецЕсли;
	Если КлючСоединенияСБазой(Контекст) <> КлючВременногоКонтекста(Контекст) Тогда
		ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, Истина);
		Возврат;
	КонецЕсли;

	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Контекст", Контекст);
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	НачатьПроверкуСуществованияВременнойБазы(Контекст,
											 Новый ОписаниеОповещения("НачатьПроверкуВозможностиВыполненияКомандыЗавершениеПроверкиСуществованияВременнойБазы",
		ЭтотОбъект, ПараметрыОповещения));
	
КонецПроцедуры


#КонецОбласти

//#Использовать asserts
//
//Перем мКонтекстКоманды;
//Перем мКаталогСборки;
//Перем мВыводКоманды;
//Перем мПутьКПлатформе1С;
//Перем ЭтоWindows Экспорт;
//
//
//Перем мИмяФайлаИнформации;

////////////////////////////////////////////////////////////////////////////////////
//// Программный интерфейс
//
//Функция ПолучитьВерсиюИзХранилища(Знач СтрокаСоединения, Знач ПользовательХранилища, Знач ПарольХранилища, Знач НомерВерсии = Неопределено) Экспорт
//
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//
//	Параметры.Добавить("/ConfigurationRepositoryF """+СтрокаСоединения+"""");
//	Параметры.Добавить("/ConfigurationRepositoryN """+ПользовательХранилища+"""");
//
//	Если Не ПустаяСтрока(ПарольХранилища) Тогда
//		Параметры.Добавить("/ConfigurationRepositoryP """+ПарольХранилища+"""");
//	КонецЕсли;
//
//	ФайлРезультата = ОбъединитьПути(КаталогСборки(), "source.cf");
//
//	Параметры.Добавить("/ConfigurationRepositoryDumpCfg """+ФайлРезультата + """");
//
//	Если Не ПустаяСтрока(НомерВерсии) Тогда
//		Параметры.Добавить("-v "+НомерВерсии);
//	КонецЕсли;
//
//	ВыполнитьКоманду(Параметры);
//
//	Возврат ФайлРезультата;
//
//КонецФункции
//
//Процедура СоздатьФайлыПоставки(Знач ПутьФайлаПолнойПоставки ="", 
//							знач ПутьФайлаПоставкиОбновления = "",
//							Знач ДистрибутивыДляОбновления = Неопределено, // Массив файлов дистрибутива cf
//							Знач ПутьФайлаСПараметрамиЛицензирования = "") Экспорт
//
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//		
//	Параметры.Добавить("/CreateDistributionFiles ");
//
//	Если НЕ ЗначениеЗаполнено(ПутьФайлаПолнойПоставки) 
//		И НЕ ЗначениеЗаполнено(ПутьФайлаПоставкиОбновления) Тогда
//		ВызватьИсключение "Не правильно заданы параметры процедуры <" + "СоздатьФайлыПоставки" +">";
//	КонецЕсли;	
//
//	Если ЗначениеЗаполнено(ПутьФайлаПолнойПоставки) Тогда
//		Параметры.Добавить("-cffile "+ОбернутьВКавычки(ПутьФайлаПолнойПоставки)+" ");
//	КонецЕсли;
//
//	Если ЗначениеЗаполнено(ПутьФайлаПоставкиОбновления) 
//		И Не ДистрибутивыДляОбновления = Неопределено 
//		И ДистрибутивыДляОбновления.Количество() > 0 Тогда
//		
//		Параметры.Добавить("-cfufile "+ОбернутьВКавычки(ПутьФайлаПоставкиОбновления)+" ");
//	
//		// Поддерживаются только файлы cf
//		Для каждого ДистрибутивОбновления Из ДистрибутивыДляОбновления Цикл
//			
//			Параметры.Добавить("-f "+ОбернутьВКавычки(ДистрибутивОбновления)+" ");
//	
//		КонецЦикла;
//	КонецЕсли;	
//
//	Если ЗначениеЗаполнено(ПутьФайлаСПараметрамиЛицензирования) Тогда
//		Параметры.Добавить("-digisign "+ОбернутьВКавычки(ПутьФайлаСПараметрамиЛицензирования)+" ");
//	КонецЕсли;
//
//	ВыполнитьКоманду(Параметры);
//
//КонецПроцедуры
//
//Процедура СоздатьФайловоеХранилищеКонфигурации(Знач ПапкаХранилища, 
//											Знач ПользовательХранилища, 
//											Знач ПарольХранилища = "", 
//											знач ПодключитьБазуКХранилищю = Ложь) Экспорт
//	
//	ОбеспечитьКаталог(ПапкаХранилища);
//	
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//		
//	Параметры.Добавить("/ConfigurationRepositoryF """+ПапкаХранилища+"""");
//	Параметры.Добавить("/ConfigurationRepositoryN """+ПользовательХранилища+"""");
//	
//	Если Не ПустаяСтрока(ПарольХранилища) Тогда
//		Параметры.Добавить("/ConfigurationRepositoryP """+ПарольХранилища+"""");
//	КонецЕсли;	
//
//	Параметры.Добавить("/ConfigurationRepositoryCreate ");
//	
//	Параметры.Добавить("-AllowConfigurationChanges");
//	Параметры.Добавить("-ChangesAllowedRule ObjectNotSupported");
//	Параметры.Добавить("-ChangesNotRecommendedRule ObjectNotSupported");
//	
//	Если ПодключитьБазуКХранилищю = Ложь Тогда
//		Параметры.Добавить("-NoBind");
//	КонецЕсли;
//
//	ВыполнитьКоманду(Параметры);
//
//КонецПроцедуры
//
//Процедура ОтключитьсяОтХранилища() Экспорт
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить("/ConfigurationRepositoryUnbindCfg -force ");
//
//	ВыполнитьКоманду(Параметры);
//КонецПроцедуры
//
//Процедура ВыгрузитьКонфигурациюВФайлы(Знач КаталогВыгрузки, Знач ФорматВыгрузки = "") Экспорт
//	
//	Если НЕ ЗначениеЗаполнено(ФорматВыгрузки) Тогда
//		ФорматВыгрузки = РежимВыгрузкиКонфигурации.Иерархический;
//	КонецЕсли;
//	
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить(СтрШаблон("/DumpConfigToFiles %1 -format %2", ОбернутьВКавычки(КаталогВыгрузки), ФорматВыгрузки));
//	ВыполнитьКоманду(Параметры);
//	
//КонецПроцедуры
//
//Процедура ЗагрузитьКонфигурациюИзФайла(Знач ФайлКонфигурации, Знач ОбновитьКонфигурациюИБ = Ложь) Экспорт
//
//	// Выполняем загрузку и обновление за два шага, т.к.
//	// иногда обновление конфигурации ИБ на новой базе проходит неудачно,
//	// если запустить две операции в одной команде.
//
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить("/LoadCfg """ + ФайлКонфигурации + """");
//	ВыполнитьКоманду(Параметры);
//
//	Если ОбновитьКонфигурациюИБ Тогда
//		ОбновитьКонфигурациюБазыДанных(Ложь, Истина);
//	КонецЕсли;
//
//КонецПроцедуры
//
//Процедура ВыгрузитьКонфигурациюВФайл(Знач ФайлКонфигурации) Экспорт
//	
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить("/DumpCfg """ + ФайлКонфигурации + """");
//	ВыполнитьКоманду(Параметры);
//	
//КонецПроцедуры
//
//// Выполнить объединение текущей конфигурации с файлом (с использованием файла настроек)
//// Описание ИТС: http://its.1c.ru/db/v83doc#bookmark:adm:TI000000527
////
//// Параметры:
////   ФайлКонфигурации - Строка - имя cf-файла с объединяемой конфигурацией.
////   ФайлНастроек - Строка - имя файла с настройками объединения конфигураций.
////   ПоставитьНаПоддержку - Булево, Неопределено - флаг необходимости установки конфигурации на поддержку.
////		Неопределено: по умолчанию флаг не передается.
////		Истина: конфигурация ставится на поддержку, если есть такая возможность.
////		Ложь: конфигурация не ставится на поддержку, даже если есть такая вожзможность.
////   ВключитьВОбъединениеОбъектыПоНеразрешеннымСсылкам - Булево, Неопределено - флаг небходимости включения
////		в объединение объектов, не включенных в список объединяемых и отсутствующих в основной конфигурации.
////		Неопределено: по умолчанию флаг не передается.
////		Истина: включать объекты с неразрешенными ссылками в список объединяемых.
////		Ложь: очищать ссылки на объекты с неразрешенными ссылками.
////   Принудительно - Булево - флаг принудительного обновления.
////		Обновление будет производиться в случае наличия:
////			предупреждений об удаляемых объектов, на которые есть ссылки в объектах, 
////				не участвующих в объединении (такие объекты будут исключены из объединения);
////			предупреждений о применении настроек.
////		Если не указан, то объединение будет прервано в вышеуказанных случаях.
////
//Процедура ОбъединитьКонфигурациюСФайлом(Знач ФайлКонфигурации, 
//								 Знач ФайлНастроек, 
//								 Знач ПоставитьНаПоддержку = Неопределено, 
//								 Знач ВключитьВОбъединениеОбъектыПоНеразрешеннымСсылкам = Неопределено, 
//								 Знач Принудительно = Ложь) Экспорт
//	
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить("/MergeCfg " + ОбернутьВКавычки(ФайлКонфигурации));
//	Параметры.Добавить("-Settings " + ОбернутьВКавычки(ФайлНастроек));
//
//	Если ПоставитьНаПоддержку = Истина Тогда
//		Параметры.Добавить("-EnableSupport");
//	ИначеЕсли ПоставитьНаПоддержку = Ложь Тогда
//		Параметры.Добавить("-DisableSupport");
//	КонецЕсли;
//
//	Если ВключитьВОбъединениеОбъектыПоНеразрешеннымСсылкам = Истина Тогда
//		Параметры.Добавить("-IncludeObjectsByUnresolvedRefs");
//	ИначеЕсли ВключитьВОбъединениеОбъектыПоНеразрешеннымСсылкам = Ложь Тогда
//		Параметры.Добавить("-ClearUnresolvedRefs");
//	КонецЕсли;
//
//	Если Принудительно Тогда
//		Параметры.Добавить("-force");
//	КонецЕсли;
//
//	ВыполнитьКоманду(Параметры);
//
//КонецПроцедуры
//
//Процедура ОбновитьКонфигурациюБазыДанных(ПредупрежденияКакОшибки = Ложь, НаСервере = Истина, ДинамическоеОбновление = Ложь) Экспорт
//
//	ПараметрыСвязиСБазой = СтандартныеПараметрыЗапускаКонфигуратора();
//	ПараметрыСвязиСБазой.Добавить("/UpdateDBCfg");
//	Если Не ДинамическоеОбновление Тогда
//		ПараметрыСвязиСБазой.Добавить("-Dynamic-");
//	КонецЕсли;
//	
//	Если ПредупрежденияКакОшибки Тогда
//		ПараметрыСвязиСБазой.Добавить("-WarningsAsErrors");
//	КонецЕсли;
//	Если НаСервере Тогда
//		ПараметрыСвязиСБазой.Добавить("-Server");
//	КонецЕсли;
//
//	ВыполнитьКоманду(ПараметрыСвязиСБазой);
//
//КонецПроцедуры
//
//Процедура ОбновитьКонфигурацию(Знач КаталогВерсии, Знач ИспользоватьПолныйДистрибутив = Ложь) Экспорт
//
//	ПараметрыЗапуска = СтандартныеПараметрыЗапускаКонфигуратора();
//
//	Если ИспользоватьПолныйДистрибутив = Неопределено Тогда
//		ИспользоватьПолныйДистрибутив = Не КаталогСодержитФайлОбновления(КаталогВерсии);
//	КонецЕсли;
//
//	Если ИспользоватьПолныйДистрибутив Тогда
//		ФайлОбновления = "1cv8.cf";
//	Иначе
//		ФайлОбновления = "1cv8.cfu";
//	КонецЕсли;
//
//	ПараметрыЗапуска.Добавить("/UpdateCfg " + ОбернутьВКавычки(ОбъединитьПути(КаталогВерсии, ФайлОбновления)));
//
//	ВыполнитьКоманду(ПараметрыЗапуска);
//
//КонецПроцедуры
//
//Процедура СнятьКонфигурациюСПоддержки(Знач Принудительно = Ложь) Экспорт
//
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить("/ManageCfgSupport -disableSupport");
//	Если Принудительно Тогда
//		Параметры.Добавить("-force");
//	КонецЕсли;
//
//	ВыполнитьКоманду(Параметры);
//
//КонецПроцедуры
//
//Процедура СконвертироватьФайлКонфигурации(Знач ФайлКонфигурации) Экспорт
//
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	Параметры.Добавить("/ConvertFiles """ + ФайлКонфигурации + """");
//	ВыполнитьКоманду(Параметры);
//
//КонецПроцедуры
//

//
//Процедура ЗагрузитьИнформационнуюБазу(ПутьВыгрузкиИБ) Экспорт
//	ФайлВыгрузки = Новый Файл(ПутьВыгрузкиИБ);
//	Ожидаем.Что(ФайлВыгрузки.Существует(), "Файл выгрузки <"+ПутьВыгрузкиИБ+"> существует, а это не так").ЭтоИстина();
//
//	ПараметрыЗапуска = СтандартныеПараметрыЗапускаКонфигуратора();
//
//	ПараметрыЗапуска.Добавить("/RestoreIB " + ОбернутьВКавычки(ПутьВыгрузкиИБ));
//
//	ВыполнитьКоманду(ПараметрыЗапуска);
//КонецПроцедуры
//
//Процедура ВыгрузитьИнформационнуюБазу(ПутьВыгрузкиИБ) Экспорт
//
//	Файл = Новый Файл(ПутьВыгрузкиИБ);
//	КаталогВыгрузкиИБ = Файл.Путь;
//
//	ОбеспечитьКаталог(КаталогВыгрузкиИБ);
//
//	ПараметрыЗапуска = СтандартныеПараметрыЗапускаКонфигуратора();
//
//	ПараметрыЗапуска.Добавить("/DumpIB " + ОбернутьВКавычки(ПутьВыгрузкиИБ));
//
//	ВыполнитьКоманду(ПараметрыЗапуска);
//
//КонецПроцедуры

//
//Функция ПолучитьПараметрыЗапуска() Экспорт
//	Возврат СтандартныеПараметрыЗапускаКонфигуратора();
//КонецФункции
//
//Процедура ВыполнитьРасширеннуюПроверкуКонфигуратора(Ключи) Экспорт
//    
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//	
//	Параметры.Добавить("/CheckConfig");
//	
//	Для Каждого СтрокаКлюча Из Ключи Цикл
//	    Если СтрокаКлюча.Значение = Истина Тогда
//		    Параметры.Добавить(СтрокаКлюча.Ключ);
//		КонецЕсли;
//	КонецЦикла; 
//	
//	ВыполнитьКоманду(Параметры);
//	
//КонецПроцедуры
//
//Процедура ВыполнитьСинтаксическийКонтроль(
//			Знач ТонкийКлиент = Истина,
//			Знач ВебКлиент = Истина,
//			Знач Сервер = Истина,
//			Знач ВнешнееСоединение = Истина,
//			Знач ТолстыйКлиентОбычноеПриложение = Истина) Экспорт
//
//	Параметры = СтандартныеПараметрыЗапускаКонфигуратора();
//
//	Параметры.Добавить("/CheckConfig");
//
//	ДобавитьФлагПроверки(Параметры, ТонкийКлиент, "-ThinClient");
//	ДобавитьФлагПроверки(Параметры, ВебКлиент, "-WebClient");
//	ДобавитьФлагПроверки(Параметры, Сервер, "-Server");
//	ДобавитьФлагПроверки(Параметры, ВнешнееСоединение, "-ExternalConnection");
//	ДобавитьФлагПроверки(Параметры, ТолстыйКлиентОбычноеПриложение, "-ThickClientOrdinaryApplication");
//
//	ВыполнитьКоманду(Параметры);
//
//КонецПроцедуры
//
//Процедура ЗапуститьВРежимеПредприятия(Знач КлючЗапуска = "", Знач УправляемыйРежим = Неопределено, Знач ДополнительныеКлючи = Неопределено) Экспорт
//	ПараметрыСвязиСБазой = ПолучитьПараметрыЗапуска();
//	ПараметрыСвязиСБазой[0] = "ENTERPRISE";
//	Если Не ПустаяСтрока(КлючЗапуска) Тогда
//		ПараметрыСвязиСБазой.Добавить("/C"+КлючЗапуска);
//	КонецЕсли;
//	Если УправляемыйРежим = Истина Тогда
//		ПараметрыСвязиСБазой.Вставить(2, "/RunModeManagedApplication");
//	ИначеЕсли УправляемыйРежим = Ложь Тогда
//		ПараметрыСвязиСБазой.Вставить(2, "/RunModeOrdinaryApplication");
//	КонецЕсли;
//
//	Если ДополнительныеКлючи <> Неопределено Тогда
//		ПараметрыСвязиСБазой.Добавить(ДополнительныеКлючи);
//	КонецЕсли;
//
//	ВыполнитьКоманду(ПараметрыСвязиСБазой);
//
//КонецПроцедуры
//
//Процедура ДобавитьФлагПроверки(Знач Параметры, Знач ФлагПроверки, Знач ИмяФлага)
//
//	Если ФлагПроверки Тогда
//		Параметры.Добавить(ИмяФлага);
//	КонецЕсли;
//
//КонецПроцедуры
//
//Функция КаталогСодержитФайлОбновления(Знач КаталогВерсии)
//
//	ФайлОбновления = Новый Файл(ОбъединитьПути(КаталогВерсии, "1cv8.cfu"));
//	Возврат ФайлОбновления.Существует();
//
//КонецФункции

//
////////////////////////////////////////////////////
//// Вспомогательные и настроечные функции
//
//Функция ПолучитьПутьКВерсииПлатформы(Знач ВерсияПлатформы) Экспорт
//
//	Если Лев(ВерсияПлатформы, 2) <> "8." Тогда
//		ВызватьИсключение "Неверная версия платформы <"+ВерсияПлатформы+">";
//	КонецЕсли;
//
//	Если ЭтоWindows = Истина Тогда
//	
//		СписокСтрок = РазложитьСтрокуВМассивПодстрок(ВерсияПлатформы, ".");
//		Если СписокСтрок.Количество() < 2 Тогда
//			ВызватьИсключение "Маска версии платформы должна содержать, как минимум, минорную и мажорную версию, т.е. Maj.Min[.Release][.Build]";
//		КонецЕсли;
//		
//		КаталогиУстановкиПлатформы = СобратьВозможныеКаталогиУстановкиПлатформыWindows();
//		
//		Если КаталогиУстановкиПлатформы.Количество() = 0 Тогда
//			Лог.Отладка("В конфигах стартера не найдены пути установки. Пробую стандартные пути наугад.");
//			файлProgramFiles = Новый Файл("C:\Program Files (x86)\");
//			Если Не файлProgramFiles.Существует() Тогда
//				файлProgramFiles = Новый Файл("C:\Program Files\");
//				Если Не файлProgramFiles.Существует() Тогда
//					ВызватьИсключение "Не обнаружено установленных версий платформы 1С";
//				КонецЕсли;
//			КонецЕсли;
//			
//			КаталогиУстановкиПлатформы.Добавить(ОбъединитьПути(файлProgramFiles.ПолноеИмя, "1Cv8"));
//			КаталогиУстановкиПлатформы.Добавить(ОбъединитьПути(файлProgramFiles.ПолноеИмя, "1Cv82"));
//			
//		КонецЕсли;
//		
//		МассивКаталогов1С = Новый Массив;
//		Для Каждого ВозможныйПуть Из КаталогиУстановкиПлатформы Цикл
//		
//			Лог.Отладка("Выполняю попытку поиска версии в каталоге " + ВозможныйПуть);
//			СформироватьБинарныйФайл(
//			МассивФайлов = НайтиФайлы(ВозможныйПуть, ВерсияПлатформы+"*");
//			Если МассивФайлов.Количество() = 0 Тогда
//				Лог.Отладка("Не найдено ни одного каталога с версией.");
//				Продолжить;
//			КонецЕсли;
//			Если МассивКаталогов1С = Неопределено Тогда
//				МассивКаталогов1С = МассивФайлов;
//			Иначе
//				Для каждого Файл Из МассивФайлов Цикл
//					МассивКаталогов1С.Добавить(Файл);
//				КонецЦикла;
//			КонецЕсли;
//		КонецЦикла;
//
//		НужныйПуть = Неопределено;
//
//		ИменаВерсий = Новый Массив;
//		Для Каждого ЭлементМассива Из МассивФайлов Цикл
//			правыйСимвол = Прав(ЭлементМассива.Имя,1);
//			Если правыйСимвол < "0" или правыйСимвол > "9" Тогда
//				Продолжить;
//			КонецЕсли;
//			ИменаВерсий.Добавить(ЭлементМассива.Имя);
//		КонецЦикла;
//
//		Если ИменаВерсий.Количество() > 0 Тогда
//			МаксВерсия = ИменаВерсий[0];
//			Для Сч = 1 По ИменаВерсий.Количество()-1 Цикл
//				Если МаксВерсия < ИменаВерсий[Сч] Тогда
//					МаксВерсия = ИменаВерсий[Сч];
//				КонецЕсли;
//			КонецЦикла;СформироватьБинарныйФайл(
//			
//			НужныйПуть = Новый Файл(ОбъединитьПути(ВозможныйПуть, МаксВерсия, "bin\1cv8.exe"));
//			Лог.Отладка("Версия найдена: " + НужныйПуть.ПолноеИмя);
//		КонецЕсли;
//		
//		Если НужныйПуть = Неопределено Тогда
//			ВызватьИсключение "Не найден путь к платформе 1С <"+ВерсияПлатформы+">";
//		КонецЕсли;
//		
//	Иначе
//		// help wanted: на Линукс конфиг стартера лежит в ~/.1C/1cestart.
//		КаталогУстановки = Новый Файл("/opt/1C/v8.3/i386");
//		Если НЕ КаталогУстановки.Существует() Тогда
//			КаталогУстановки = Новый Файл("/opt/1C/v8.3/x86_64");
//		КонецЕсли;
//		НужныйПуть = Новый Файл(Строка(КаталогУстановки.ПолноеИмя) + "/" + "1cv8");
//	КонецЕсли;
//	
//	Если Не НужныйПуть.Существует() Тогда
//		ВызватьИсключение "Ошибка определения версии платформы. Файл <"+НужныйПуть.ПолноеИмя+"> не существует";
//	КонецЕсли;
//
//	Возврат НужныйПуть.ПолноеИмя;
//
//КонецФункции
//
//Процедура УстановитьКлючРазрешенияЗапуска(Знач Ключ) Экспорт
//	мКонтекстКоманды.КлючРазрешенияЗапуска = Ключ;
//КонецПроцедуры
//
//Процедура УстановитьКодЯзыка(Знач Код) Экспорт
//	мКонтекстКоманды.КодЯзыка = Код;
//	Если ПустаяСтрока(мКонтекстКоманды.КодЯзыкаСеанса) Тогда 
//		мКонтекстКоманды.КодЯзыкаСеанса = Код;
//	КонецЕсли;
//КонецПроцедуры
//
//Процедура УстановитьКодЯзыкаСеанса(Знач Код) Экспорт
//	мКонтекстКоманды.КодЯзыкаСеанса = Код;
//КонецПроцедуры
//
//Функция ВыводКоманды() Экспорт
//	Возврат мВыводКоманды;
//КонецФункции
//
//Функция КаталогСборки(Знач Каталог = "") Экспорт
//
//	Если мКаталогСборки = Неопределено Тогда
//		мКаталогСборки = ТекущийКаталог();
//	КонецЕсли;
//
//	Если Каталог = "" Тогда
//		Возврат мКаталогСборки;
//	Иначе
//		ТекКаталог = мКаталогСборки;
//		мКаталогСборки = Каталог;
//		Возврат ТекКаталог;
//	КонецЕсли;
//
//КонецФункции
//
//Функция ПутьКПлатформе1С(Знач Путь = "") Экспорт
//
//	Если Путь = "" Тогда
//		Возврат мПутьКПлатформе1С;
//	Иначе
//		ФайлПлатформы = Новый Файл(Путь);
//		Если Не ФайлПлатформы.Существует() Тогда
//			ВызватьИсключение "Нельзя установить несуществующий путь к платформе: " + ФайлПлатформы.ПолноеИмя;
//		КонецЕсли;
//
//		ТекЗначение = мПутьКПлатформе1С;
//		мПутьКПлатформе1С = Путь;
//		Возврат ТекЗначение;
//	КонецЕсли;СформироватьБинарныйФайл(
//
//КонецФункции
//
//Процедура ИспользоватьВерсиюПлатформы(Знач МаскаВерсии) Экспорт
//	Путь = ПолучитьПутьКВерсииПлатформы(МаскаВерсии);
//	ПутьКПлатформе1С(Путь);
//КонецПроцедуры
//
//Функция ПутьКТонкомуКлиенту1С(Знач ПутьКПлатформе1С = "") Экспорт
//	Сообщить("ПутьКТонкомуКлиенту1С: Путь платформы 1С <"+ПутьКПлатформе1С+">");
//	Если ПутьКПлатформе1С = "" Тогда
//		ПутьКПлатформе1С = ПутьКПлатформе1С();
//		Сообщить("ПутьКТонкомуКлиенту1С: вычислили Путь платформы 1С <"+ПутьКПлатформе1С+">");
//	КонецЕсли;
//
//	ФайлПриложения = Новый Файл(ПутьКПлатформе1С);
//	Каталог = ФайлПриложения.Путь;
//	ИмяФайлаТонкогоКлиента = ?(ЭтоWindows=Истина, "1cv8c.exe", "1cv8c");
//	ФайлПриложения = Новый Файл(ОбъединитьПути(Каталог, ИмяФайлаТонкогоКлиента));
//	Если Не ФайлПриложения.Существует() Тогда
//		ВызватьИсключение "Не установлен тонкий клиент";
//	КонецЕсли;
//
//	Сообщить("ПутьКТонкомуКлиенту1С: получили путь к тонкому клиенту 1С <"+ФайлПриложения.ПолноеИмя+">");
//	Возврат ФайлПриложения.ПолноеИмя;
//
//КонецФункции
//
//Процедура УстановитьИмяФайлаСообщенийПлатформы(Знач Имя) Экспорт
//	мИмяФайлаИнформации = Имя; // если будет абс. путь, то ОбъединитьПути отработает корректно.
//КонецПроцедуры
//
//Процедура УдалитьВременнуюБазу() Экспорт
//
//	Если ВременнаяБазаСуществует() Тогда
//		КаталогВременнойБазы = ПутьКВременнойБазе();
//		Лог.Отладка("Удаляю временную базу: "+КаталогВременнойБазы);
//		УдалитьФайлы(КаталогВременнойБазы);
//	КонецЕсли;
//
//КонецПроцедуры
//
//Функция СобратьВозможныеКаталогиУстановкиПлатформыWindows()
//
//	СИ = Новый СистемнаяИнформация;
//		
//	// Ищем в расположениях для Vista и выше.
//	// Желающие поддержать пути в Windows XP - welcome
//	КаталогВсеПользователи = СИ.ПолучитьПеременнуюСреды("ALLUSERSPROFILE");
//	КаталогТекущегоПользователя = СИ.ПолучитьПеременнуюСреды("APPDATA");
//	
//	МассивПутей = Новый Массив;
//	СуффиксРасположения = "1C\1CEStart\1CEStart.cfg";
//	
//	ОбщийКонфиг = ОбъединитьПути(КаталогВсеПользователи, СуффиксРасположения);
//	ДополнитьМассивРасположенийИзКонфигурационногоФайла(ОбщийКонфиг, МассивПутей);
//	
//	ПользовательскийКонфиг = ОбъединитьПути(КаталогТекущегоПользователя, СуффиксРасположения);
//	ДополнитьМассивРасположенийИзКонфигурационногоФайла(ПользовательскийКонфиг, МассивПутей);
//	
//	Возврат МассивПутей;
//	
//КонецФункции
//
//Процедура ДополнитьМассивРасположенийИзКонфигурационногоФайла(Знач ИмяФайла, Знач МассивПутей)
//	
//	ФайлКонфига = Новый Файл(ИмяФайла);
//	Если Не ФайлКонфига.Существует() Тогда
//		Лог.Отладка("Конфигурационный файл " + ИмяФайла + " не найден.");
//		Возврат;
//	КонецЕсли;
//	
//	Лог.Отладка("Читаю конфигурационный файл " + ИмяФайла + ".");
//	Конфиг = Новый КонфигурацияСтартера;
//	Конфиг.Открыть(ИмяФайла);
//	
//	Значения = Конфиг.ПолучитьСписок("InstalledLocation");
//	Если Значения <> Неопределено Тогда
//		Для Каждого Путь Из Значения Цикл
//			МассивПутей.Добавить(Путь);
//		КонецЦикла;
//	КонецЕсли;
//	
//КонецПроцедуры
//
////////////////////////////////////////////////////////////////////////////////////
//// Служебные процедуры
//


//

//


//
//Функция ПрочитатьФайлИнформации()
//
//	Текст = "";
//
//	Файл = Новый Файл(ФайлИнформации());
//	Если Файл.Существует() Тогда
//		Чтение = Новый ЧтениеТекста(Файл.ПолноеИмя);
//		Текст = Чтение.Прочитать();
//		Чтение.Закрыть();
//	Иначе
//		Текст = "Информации об ошибке нет";
//	КонецЕсли;
//
//	Лог.Отладка("файл информации:
//	|"+Текст);
//	Возврат Текст;
//
//КонецФункции
//
//Процедура УстановитьВывод(Знач Сообщение)
//	мВыводКоманды = Сообщение;
//КонецПроцедуры
//

//
//Процедура ОбеспечитьКаталог(Знач Каталог)
//
//	Файл = Новый Файл(Каталог);
//	Если Не Файл.Существует() Тогда
//		СоздатьКаталог(Каталог);
//	ИначеЕсли Не Файл.ЭтоКаталог() Тогда
//		ВызватьИсключение "Каталог " + Каталог + " не является каталогом";
//	КонецЕсли;
//
//КонецПроцедуры


//
//Функция ХранилищеКонфигурацииСуществует(Знач ПапкаХранилища) Экспорт
//	ФайлБазы = Новый Файл(ОбъединитьПути(ПапкаХранилища, "1cv8ddb.1CD"));
//	
//	Возврат ФайлБазы.Существует();
//КонецФункции
//
//
//
//Функция РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока, Разделитель)
//
//	МассивПодстрок = Новый Массив;
//	ОстатокСтроки = ИсходнаяСтрока;
//
//	Поз = -1;
//	Пока Поз <> 0 Цикл
//
//		Поз = Найти(ОстатокСтроки, Разделитель);
//		Если Поз > 0 Тогда
//			Подстрока = Лев(ОстатокСтроки, Поз-1);
//			ОстатокСтроки = Сред(ОстатокСтроки, Поз+1);
//		Иначе
//			Подстрока = ОстатокСтроки;
//		КонецЕсли;
//
//		МассивПодстрок.Добавить(Подстрока);
//
//	КонецЦикла;
//
//	Возврат МассивПодстрок;
//
//КонецФункции
//
//Функция ОбернутьВКавычки(Знач Строка);
//	Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда
//		Возврат Строка;
//	Иначе
//		Возврат """" + Строка + """";
//	КонецЕсли;
//КонецФункции
//
//Процедура Инициализация()
//	СистемнаяИнформация = Новый СистемнаяИнформация;
//	ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
//
//	мКонтекстКоманды = Новый Структура;
//	мКонтекстКоманды.Вставить("КлючСоединенияСБазой", "");
//	мКонтекстКоманды.Вставить("ИмяПользователя", "");
//	мКонтекстКоманды.Вставить("Пароль", "");
//	мКонтекстКоманды.Вставить("КлючРазрешенияЗапуска", "");
//	мКонтекстКоманды.Вставить("КодЯзыка", "");
//	мКонтекстКоманды.Вставить("КодЯзыкаСеанса", "");
//
//
//	ПутьКПлатформе1С(ПолучитьПутьКВерсииПлатформы("8.3"));
//КонецПроцедуры
//
//
//Процедура ПолучитьИзмененияКонфигурацииБазыДанныхИзХранилища(Знач СтрокаСоединения, Знач ПользовательХранилища, Знач ПарольХранилища="") Экспорт
//
//	ПараметрыСвязиСБазой = СтандартныеПараметрыЗапускаКонфигуратора();
//	
//	ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryF """+СтрокаСоединения+"""");
//	ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryN """+ПользовательХранилища+"""");
//	
//	Если Не ПустаяСтрока(ПарольХранилища) Тогда
//		ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryP """+ПарольХранилища+"""");
//	КонецЕсли;	
//	
//	ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryUpdateCfg");
//	ПараметрыСвязиСБазой.Добавить("-force");
//	
//	ВыполнитьКоманду(ПараметрыСвязиСБазой);
//
//КонецПроцедуры
//
//Процедура ОбновитьКонфигурациюБазыДанныхИзХранилища(СтрокаСоединения, ПользовательХранилища, ПарольХранилища="") Экспорт
//
//	ПараметрыСвязиСБазой = СтандартныеПараметрыЗапускаКонфигуратора();
//	
//	ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryF """+СтрокаСоединения+"""");
//	ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryN """+ПользовательХранилища+"""");
//	
//	Если Не ПустаяСтрока(ПарольХранилища) Тогда
//		ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryP """+ПарольХранилища+"""");
//	КонецЕсли;	
//	
//	ПараметрыСвязиСБазой.Добавить("/ConfigurationRepositoryUpdateCfg");
//	ПараметрыСвязиСБазой.Добавить("-force");
//	
//	ПараметрыСвязиСБазой.Добавить("/UpdateDBCfg");
//	
//	ВыполнитьКоманду(ПараметрыСвязиСБазой);
//КонецПроцедуры
//
//Функция ВариантОбработкиНесуществующихСсылок() Экспорт
//
//	Варианты = Новый Структура;
//	Варианты.Вставить("СоздаватьОбъекты", 1);
//	Варианты.Вставить("ОчищатьОбъекты",   2);
//	Варианты.Вставить("НеИзменять",       3);
//
//	Возврат Новый ФиксированнаяСтруктура(Варианты);
//
//КонецФункции // ИмяФункции()
//
//Функция ВариантОбработкиЧастичнойПотериДанных() Экспорт
//	
//	Варианты = Новый Структура;
//	Варианты.Вставить("СоздаватьОбъекты", 1);
//	Варианты.Вставить("УдалятьОбъекты",   2);
//
//	Возврат Новый ФиксированнаяСтруктура(Варианты);
//
//КонецФункции // ИмяФункции()
//
//// Структура с возможными параметрами запуска ТиИ.
//// По умолчанию включены все опции, нет ограничения по времени проведения тестирования.
////
//// ВариантОбработкиНесуществующихСсылок:
////   - создавать объекты (по умолчанию)
////   - очищать объекты
////   - не изменять при частичной потере объектов
////
//// ВариантОбработкиЧастичнойПотериДанных:
////   - создавать объекты (по умолчанию)
////   - удалять объекты
//// 
//Функция ПолучитьОпцииТиИ() Экспорт
//
//	ВариантыОбработкиНесуществующихСсылок = ВариантОбработкиНесуществующихСсылок();
//	ВариантыОбработкиЧастичнойПотериДанных = ВариантОбработкиЧастичнойПотериДанных();
//
//
//	СтруктураОпцииТиИ = Новый Структура;
//	СтруктураОпцииТиИ.Вставить("ТолькоТестирование", Истина);
//	СтруктураОпцииТиИ.Вставить("Реиндексация", Истина);
//	СтруктураОпцииТиИ.Вставить("ЛогическаяЦелостность", Истина);
//	СтруктураОпцииТиИ.Вставить("ЛогическаяИСсылочнаяЦелостность", Истина);
//	СтруктураОпцииТиИ.Вставить("ПересчетИтогов", Истина);
//	СтруктураОпцииТиИ.Вставить("СжатиеТаблиц", Истина);
//	СтруктураОпцииТиИ.Вставить("Реструктуризация", Истина);
//	СтруктураОпцииТиИ.Вставить("ВариантОбработкиНесуществующихСсылок", ВариантыОбработкиНесуществующихСсылок.СоздаватьОбъекты);
//	СтруктураОпцииТиИ.Вставить("ВариантОбработкиЧастичнойПотериДанных", ВариантыОбработкиЧастичнойПотериДанных.СоздаватьОбъекты);
//	СтруктураОпцииТиИ.Вставить("ПродолжитьТиИСТочкиПрерывания", Ложь);
//	СтруктураОпцииТиИ.Вставить("МаксВремяТестирования", "");
//	Возврат СтруктураОпцииТиИ;
//
//КонецФункции // ПолучитьОпцииТиИ()
//
//// Запустить тестирование и исправление с указанными опциями.
//// Функция ПолучитьОпцииТиИ вернет структуру со всеми опциями.
//// По умолчанию все опции включены. Отключаются переопределением значения.
////
//// Параметры:
////   Параметры - Структура - Структура с опциями запуска. Если параметр не заполнен - делается полная проверка.
////
//// Пример:
////   СтрокаСоединения =  "/Fc:\work\db\fin\";
////   УправлениеКонфигуратором = Новый УправлениеКонфигуратором();
////   УправлениеКонфигуратором.УстановитьКонтекст(СтрокаСоединения, "", "");
////   // Полная проверка
////   УправлениеКонфигуратором.ЗапуститьТестированиеИИсправление();
////
////   ОпцииТиИ = УправлениеКонфигуратором.ПолучитьОпцииТиИ();
////   // Отключить проверку логической и ссылочной целостности
////   ОпцииТиИ.Вставить("ЛогическаяИСсылочнаяЦелостность", Ложь);
////   УправлениеКонфигуратором.ЗапуститьТестированиеИИсправление(ОпцииТиИ);
////
//Процедура ЗапуститьТестированиеИИсправление(Параметры = Неопределено) Экспорт
//
//	ПараметрыСвязиСБазой = СтандартныеПараметрыЗапускаКонфигуратора();
//	ВариантыОбработкиНесуществующихСсылок = ВариантОбработкиНесуществующихСсылок();
//	ВариантыОбработкиЧастичнойПотериДанных = ВариантОбработкиЧастичнойПотериДанных();
//
//	Если Параметры = Неопределено Тогда
//		Параметры = ПолучитьОпцииТиИ();
//	КонецЕсли;
//
//	СтрокаОпций = "/IBCheckAndRepair";
//	СтрокаОпций = СтрокаОпций + ?(Параметры.ТолькоТестирование, " -TestOnly", "");
//	СтрокаОпций = СтрокаОпций + ?(Параметры.Реиндексация, " -ReIndex", "");
//	СтрокаОпций = СтрокаОпций + ?(Параметры.ЛогическаяЦелостность, " -LogIntegrity", "");
//	СтрокаОпций = СтрокаОпций + ?(Параметры.ЛогическаяИСсылочнаяЦелостность, " -LogAndRefsIntegrity", "");
//	СтрокаОпций = СтрокаОпций + ?(Параметры.ПересчетИтогов, " -RecalcTotals", "");
//	СтрокаОпций = СтрокаОпций + ?(Параметры.СжатиеТаблиц, " -IBCompression", "");
//	СтрокаОпций = СтрокаОпций + ?(Параметры.Реструктуризация, " -Rebuild", "");
//
//	БитыеСсылки = Параметры.ВариантОбработкиНесуществующихСсылок;
//	СтрокаОпций = СтрокаОпций + ?(БитыеСсылки = ВариантыОбработкиНесуществующихСсылок.СоздаватьОбъекты, " -BadRefCreate", ?(БитыеСсылки = ВариантыОбработкиНесуществующихСсылок.ОчищатьОбъекты, " -BadRefClear", " -BadRefNone"));
//
//	ЧастичнаяПотеря = Параметры.ВариантОбработкиЧастичнойПотериДанных;
//	СтрокаОпций = СтрокаОпций + ?(ЧастичнаяПотеря = ВариантыОбработкиЧастичнойПотериДанных.СоздаватьОбъекты, " -BadDataCreate", " -BadDataDelete");
//
//	СтрокаОпций = СтрокаОпций + ?(Параметры.ПродолжитьТиИСТочкиПрерывания, " -UseStartPoint", "");
//
//	СтрокаОпций = СтрокаОпций + ?(Параметры.МаксВремяТестирования = "", ""," -TimeLimit:" + Параметры.МаксВремяТестирования);
//	
//	ПараметрыСвязиСБазой.Добавить(СтрокаОпций);
//
//	Лог.Отладка("Параметры запуска ТиИ: " + СтрокаОпций); 
//
//	ВыполнитьКоманду(ПараметрыСвязиСБазой);
//
//КонецПроцедуры // ИмяПроцедуры()
//
////////////////////////////////////////////////////////////////////////////////////////
//// Инициализация
//
////Инициализация();
